#include "lcd_bsp.h"

static void lcd_gpio_init(void)
{

    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_GPIOB);

    gpio_mode_set(LCD_SCK_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, LCD_SCK_PIN);
    gpio_mode_set(LCD_MOSI_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, LCD_MOSI_PIN);

    gpio_af_set(LCD_SCK_PORT, GPIO_AF_5, LCD_SCK_PIN);
    gpio_af_set(LCD_MOSI_PORT, GPIO_AF_5, LCD_MOSI_PIN);

    gpio_mode_set(LCD_CS_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LCD_CS_PIN);
    gpio_output_options_set(LCD_CS_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, LCD_CS_PIN);

    gpio_mode_set(LCD_DISP_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LCD_DISP_PIN);
    gpio_output_options_set(LCD_DISP_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, LCD_DISP_PIN);
}

static void lcd_gpio_deinit(void)
{
    rcu_periph_clock_disable(RCU_GPIOA);
    rcu_periph_clock_disable(RCU_GPIOB);

    gpio_mode_set(LCD_CS_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, LCD_CS_PIN);
    gpio_mode_set(LCD_SCK_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, LCD_SCK_PIN);
    gpio_mode_set(LCD_MOSI_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, LCD_MOSI_PIN);
    // gpio_mode_set(LCD_DISP_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, LCD_DISP_PIN);
}

static void lcd_spi_init(void)
{
    spi_parameter_struct spi;
    rcu_periph_clock_enable(RCU_SPI0);

    spi.device_mode = SPI_MASTER;
    spi.trans_mode = SPI_TRANSMODE_BDTRANSMIT;
    spi.frame_size = SPI_FRAMESIZE_8BIT;
    spi.nss = SPI_NSS_SOFT;
    spi.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;
    spi.prescale = SPI_PSC_4;
    spi.endian = SPI_ENDIAN_MSB;
    spi_init(SPI0, &spi);
    spi_fifo_access_size_config(SPI0, SPI_BYTE_ACCESS);
    spi_enable(SPI0);
}

static void lcd_spi_deinit(void)
{
    spi_i2s_deinit(SPI0);
    rcu_periph_clock_disable(RCU_SPI0);
}

void lcdInit(void)
{
    lcd_gpio_init();
    lcd_spi_init();
}

void lcdDeInit(void)
{
    lcd_spi_deinit();
    lcd_gpio_deinit();
}
void lcdWrite(uint8_t *data, int len)
{
    for (int i = 0; i < len; i++)
    {
        spi_i2s_data_transmit(SPI0, data[i]);
        while (RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE))
        {
        };
    }
}

void lcdCSSet(uint8_t cs)
{
    if (cs)
        gpio_bit_set(LCD_CS_PORT, LCD_CS_PIN);
    else
        gpio_bit_reset(LCD_CS_PORT, LCD_CS_PIN);
}
void lcdDispSet(uint8_t disp)
{
    if (disp)
        gpio_bit_set(LCD_DISP_PORT, LCD_DISP_PIN);
    else
        gpio_bit_reset(LCD_DISP_PORT, LCD_DISP_PIN);
}
